package cn.itsource.ymjs.service.impl;

import cn.itsource.ymjs.dto.CourseDto;
import cn.itsource.ymjs.entify.FitnessCourse;
import cn.itsource.ymjs.entify.FitnessCourseDetail;
import cn.itsource.ymjs.entify.FitnessCourseMarket;
import cn.itsource.ymjs.entify.FitnessCourseType;
import cn.itsource.ymjs.query.CourseQuery;
import cn.itsource.ymjs.query.CourseTypeQuery;
import cn.itsource.ymjs.repository.CourseTypeRepository;
import cn.itsource.ymjs.repository.FitnessCourseRepository;
import cn.itsource.ymjs.service.ICourseTypeService;
import cn.itsource.ymjs.service.IFitnessCourseService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Transactional
@Service
public class CourseTypeServiceImpl extends BaseServiceImpl<FitnessCourseType, CourseTypeQuery> implements ICourseTypeService {

    @Autowired
    private RedisTemplate redisTemplate;

    @Autowired
    private CourseTypeRepository repository;

    private static final String COURSE_TYPE_TREE_DATA = "course_Type_Tree_Data";

    /**
     * 代码递归
     * @param pid
     * @return
     */
    @Override
    public List<FitnessCourseType> treeData(long pid) {

        // return loadTreeDataByRecursion(pid);
        // return courseTypeMapper.loadTreeData(pid);
        List<FitnessCourseType> courseTypes = (List<FitnessCourseType>) redisTemplate.opsForValue().get(CourseTypeServiceImpl.COURSE_TYPE_TREE_DATA);
        if (courseTypes != null){
            return courseTypes;
        }
        List<FitnessCourseType> courseTypesTem = loadTreeDataByLoop(pid);
        redisTemplate.opsForValue().set(CourseTypeServiceImpl.COURSE_TYPE_TREE_DATA,courseTypesTem);
        return courseTypesTem;
    }

    /**
     * 循环方式 1条sql+自己组织关系
     * @param pid
     * @return
     */
    private List<FitnessCourseType> loadTreeDataByLoop(Long pid) {
        // 创建返回的集合
        List<FitnessCourseType> result  = new ArrayList<>();
        // 查询所有的节点
        List<FitnessCourseType> courseTypes = repository.findAll();
        // 新建一个集合来装
        Map<Long,FitnessCourseType> allCourseTypesDto = new HashMap<>();
        // 遍历,将所有节点放到Map集合中,id作为key,节点作为value
        courseTypes.forEach(courseType -> {
            allCourseTypesDto.put(courseType.getId(),courseType);
        });
        // 遍历节点
        courseTypes.forEach(courseType -> {
            Long ppid = courseType.getPid();
            // 如果为一级节点就添加到返回集合中
            if (ppid.longValue() == pid.longValue()){
                result.add(courseType);
            } else { // 不是一级节点,就把该节点添加到父级节点中
                // 从Map集合中获取父级对象
                FitnessCourseType parent = allCourseTypesDto.get(ppid);
                parent.getChildren().add(courseType);
            }
        });
        return result;
    }

}
